package main.leetcode.clockin.March;

/**
 * 1160.拼写单词 给你一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。
 *
 * <p>假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。
 *
 * <p>注意：每次拼写时，chars 中的每个字母都只能用一次。
 *
 * <p>返回词汇表 words 中你掌握的所有单词的 长度之和。
 *
 * <p>
 *
 * <p>示例 1：输入：words = ["cat","bt","hat","tree"], chars = "atach" 输出：6 解释： 可以形成字符串 "cat" 和
 * "hat"，所以答案是 3 + 3 = 6。
 *
 * <p>示例 2：输入：words = ["hello","world","leetcode"], chars = "welldonehoneyr" 输出：10 解释： 可以形成字符串
 * "hello" 和 "world"，所以答案是 5 + 5 = 10。
 *
 * <p>提示：1 <= words.length <= 1000，1 <= words[i].length, chars.length <= 100，所有字符串中都仅包含小写英文字母
 *
 * <p>来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day17 {
    public static void main(String[] args) {
        System.out.println(
                new day17()
                        .countCharacters(
                                new String[] {"hello", "world", "leetcode"}, "welldonehoneyr"));
    }

    //    public int countCharacters(String[] words, String chars) {
    //        int i;
    //        int res = 0;
    //        int[] characters = new int[26];
    //        int[] tmp;
    //        for (i = 0; i < chars.length(); i++) characters[chars.charAt(i) - 'a']++;
    //
    //        for (String s : words) {
    //            tmp = characters.clone();
    //            for (i = 0; i < s.length(); i++) {
    //                if (tmp[s.charAt(i) - 'a'] > 0) tmp[s.charAt(i) - 'a']--;
    //                else break;
    //            }
    //            if (i == s.length()) res += s.length();
    //        }
    //        return res;
    //    }

    // 优化(没什么差别倒是
    public int countCharacters(String[] words, String chars) {
        int i;
        int res = 0;
        int[] characters = new int[26];
        int[] tmp;
        for (i = 0; i < chars.length(); i++) characters[chars.charAt(i) - 'a']++;
        for (String s : words) {
            tmp = new int[26];
            for (i = 0; i < s.length(); i++) {
                ++tmp[s.charAt(i) - 'a'];
                if (tmp[s.charAt(i) - 'a'] > characters[s.charAt(i) - 'a']) break;
            }
            if (i == s.length()) res += s.length();
        }
        return res;
    }
}
